package com.me.study.javaCore.reflection;

import com.me.common.pojo.Point;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * Reflection：通过反射获取构造方法并且创建对象
 * 作者     JSD1402班
 * 时间     下午1:33:52
 */
public class ConstructorReflect {

    public static void main(String[] args) {
        // 获取Class实例
        Class<?> c = Point.class;
        // 获取构造方法
        Constructor<?>[] constructors = c.getDeclaredConstructors();
        // 输出
        for (Constructor<?> cc : constructors) {
            System.out.println(cc);
        }

        System.out.println("------------------------");

        try {
            // 1.Constructor类中的newInstance(...)方法
            // 调用无参构造方法创建对象
            // 根据参数来获取指定构造
            // 简化版本
            // Constructor<?> c1 = c.getDeclaredConstructor();
            // Point p1 = (Point) c1.newInstance();

            // 写全版本
            Constructor<?> c1 = c.getDeclaredConstructor(new Class<?>[]{});
            Point p1 = (Point) c1.newInstance(new Object[]{});

            // 调用有参构造创建对象
            Constructor<?> c2 = c.getDeclaredConstructor(new Class<?>[]{int.class, int.class});
            Point p2 = (Point) c2.newInstance(new Object[]{10, 20});


            // 2.Class类中newInstance()方法,它只能调用空参构造来创建对象
            // 为了反射创建对象的便利,所以在实体类中最好添加空参构造
            Point p3 = (Point) c.newInstance();

        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}
